﻿#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//操作符优先级及结合性
//优先级：如果⼀个表达式包含多个运算符，哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的
//结合性：则根据运算符是左结合，还是右结合，决定执⾏顺序。


//整体提升
//C语⾔中整型算术运算总是⾄少以缺省（默认）整型类型的精度来进⾏的。
//为了获得这个精度，表达式中的字符和短整型操作数在使⽤之前被转换为普通整型，这种转换称为整型提升。
// 

//int main()
// 
//{
//	char a, b, c;
//	...
//		a = b + c;
//
//
//	return 0;
//}

// b和c的值被提升为普通整型，然后再执⾏加法运算。
//加法运算完成之后，结果将被截断，然后再存储于a中。

//如何进⾏整体提升呢？
//1. 有符号整数提升是按照变量的数据类型的符号位来提升的
//2. ⽆符号整数提升，⾼位补0


//11.2 算术转换
//如果某个操作符的各个操作数属于不同的类型，那么除⾮其中⼀个操作数的转换为另⼀个操作数的类
//型，否则操作就⽆法进⾏。下⾯的层次体系称为寻常算术转换


//long double
//double
//float
//unsigned long int
//long int
//unsigned int
//int


//各种例子

//exp1
//1表达式的求值部分由操作符的优先级决定。
//2表达式
//a * b + c * d + e * f

//计算的路径不唯一
//



//exp2
// 1
//表达式
//c + --c;

//不知道究竟是   c是用的  --c后c，还是没--c后的c

////
//表达式3
//int main()
//{
//	int i = 10;
//	i = i-- - --i * (i = -3) * i++ + ++i;
//	printf("i = %d\n", i);
//	return 0;
//}

//非法表达式程序，每个编译器结果不同

//
//int fun()
//{
//	static int count = 1;
//	return ++count;
//}
//int main()
//{
//	int answer;
//	answer = fun() - fun() * fun();
//}
//printf("%d\n", answer);
//
//return 0;

//但是上述代码
//answer = fun() - fun() * fun();中我们只能通过操作符的优先级得知：先算乘法，再算减法。
//函数的调⽤先后顺序⽆法通过操作符的优先级确定。


//include <stdio.h>
//int main()
//{
//	int i = 1;
//	int ret = (++i) + (++i) + (++i);
//	printf("%d\n", ret);
//	printf("%d\n", i);
//	return 0;
//}
//与表达式2类似

//总结
//即使有了操作符的优先级和结合性，我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的
//计算路径，那这个表达式就是存在潜在⻛险的，建议不要写出特别复杂的表达式。
